package backdate;
//https://leetcode.cn/leetbook/read/illustration-of-algorithm/58wowd/
public class LCR_129字母迷宫 {
    /**
     * 深度优先搜索： 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归，先朝一个方向搜到底，再回溯至上个节点，沿另一个方向搜索，以此类推。
     * 剪枝： 在搜索中，遇到 这条路不可能和目标字符串匹配成功 的情况（例如：此矩阵元素和目标字符不同、此元素已被访问），则应立即返回，称之为 可行性剪枝 。
     */
    //DFS + 剪枝
    class Solution {
        public boolean wordPuzzle(char[][] grid, String target) {
            char[] words = target.toCharArray();
            for(int i=0; i<grid.length; i++){
                for(int j=0; j<grid[0].length; j++)
                    if(dfs(grid,words,i,j,0)) return true;
            }
            return false;
        }
        private boolean dfs(char[][] grid,char[] target,int i,int j,int k){
            if(i >= grid.length || i < 0 || j >= grid[0].length || j < 0 || grid[i][j] != target[k]) return false;
            if(k == target.length - 1) return true;
            grid[i][j] = '\0';
            boolean res = dfs(grid,target,i+1,j,k+1) || dfs(grid,target,i,j+1,k+1) ||
                    dfs(grid,target,i-1,j,k+1) || dfs(grid,target,i,j-1,k+1);
            grid[i][j] = target[k];
            return res;
        }
    }
}
